package com

import groovy.sql.Sql
import java.text.SimpleDateFormat
import java.util.Date;

class FluxoCaixaController {

	def scaffold = FluxoCaixa

	static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

	def jasperService
	def movimentosService
	def dataSource

	def index = {
		redirect(action: "create", params: params)
	}

	def create = {
		def fluxoCaixaInstance = new FluxoCaixa()
		fluxoCaixaInstance.properties = params

		List listaFluxoCaixa = FluxoCaixa.executeQuery("FROM FluxoCaixa")

		listaFluxoCaixa.each { fluxoCaixa ->
			try {
				fluxoCaixa.delete(flush: true)
			}
			catch (org.springframework.dao.DataIntegrityViolationException e) {
				flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'fluxoCaixa.label', default: 'FluxoCaixa'), params.id])}"
			}
		}

		return [fluxoCaixaInstance: fluxoCaixaInstance]
	}

	def save = {
		def fluxoCaixaInstance = new FluxoCaixa(params)

		println("params: "+params)

		if(params.contasCorrentes == null){
			println("AQUII")
			flash.message = "${message(code: 'default.created.message', args: [message(code: 'fluxoCaixa.label', default: 'FluxoCaixa'), fluxoCaixaInstance.id])}"
			redirect(action: "index", params:params)
		}
		
		List<ContasCorrente> contasCorrentesList = new ArrayList()
		contasCorrentesList.addAll(params.contasCorrentes.id)
		
		String strContasCorrentes = ""
		contasCorrentesList.each{ strContasCorrentes += it+"," }
		strContasCorrentes = strContasCorrentes.substring(0,(strContasCorrentes.length() - 1))
		println("strContasCorrentes: "+strContasCorrentes)
		
		def sql = new Sql(dataSource)
		
		def paramsGetContasReceberPagar = [strContasCorrentes: strContasCorrentes, dataInicial: params.dataInicial, dataFinal: params.dataFinal]
		
		def queryListContasReceber = "select contas_receber.id from contas_receber left join contas_corrente on (contas_corrente.id=contas_receber.conta_corrente_id) where contas_receber.baixada=1 and contas_receber.conta_corrente_id in (:strContasCorrentes) and contas_receber.data_baixa between :dataInicial and :dataFinal"
		
		def queryListContasPagar = "select contas_pagar.id from contas_pagar left join contas_corrente on (contas_corrente.id=contas_pagar.conta_corrente_id) where contas_pagar.baixada=1 and contas_pagar.conta_corrente_id in (:strContasCorrentes) and contas_pagar.data_baixa between :dataInicial and :dataFinal"
		
		def contasReceberList = sql.rows(queryListContasReceber, paramsGetContasReceberPagar)
		println("contasReceberList: "+contasReceberList)
		def contasPagarList = sql.rows(queryListContasPagar, paramsGetContasReceberPagar)
		println("contasPagarList: "+contasPagarList)

		//List<ContasReceber> contasReceberList = ContasReceber.findAllByContaCorrenteAndDataBaixaBetween(params.dataInicial, params.dataFinal)
		//List<ContasPagar> contasPagarList = ContasPagar.findAllByDataBaixaBetween(params.dataInicial, params.dataFinal)
		
		List listContasReceber = new ArrayList()
		List listContasPagar = new ArrayList()
		
		def saldoReceberPagar = 0.0
		def saldoReceber = 0.0
		def saldoPagar = 0.0
		
		contasReceberList.each{
			ContasReceber contasReceber = ContasReceber.get(it.id)
			saldoReceber += contasReceber.valor
			listContasReceber.add(contasReceber)
		}
		
		fluxoCaixaInstance.saldoEntrada = saldoReceber
		
		contasPagarList.each{
			ContasPagar contasPagar = ContasPagar.get(it.id)
			saldoPagar += contasPagar.valor
			listContasPagar.add(contasPagar)
		}
		
		fluxoCaixaInstance.saldoSaida = saldoPagar
		
		saldoReceberPagar = saldoPagar + saldoReceber
		println("saldoReceberPagar: "+saldoReceberPagar)
		
		
		fluxoCaixaInstance.contasReceber = listContasReceber	
		fluxoCaixaInstance.contasPagar = listContasPagar

		fluxoCaixaInstance.saldoInicial = apuraSaldoFc(strContasCorrentes, fluxoCaixaInstance.dataInicial)
		println("fluxoCaixaInstance.saldoInicial: "+fluxoCaixaInstance.saldoInicial)

		fluxoCaixaInstance.saldoFinal = saldoReceberPagar + fluxoCaixaInstance.saldoInicial
		 
		movimentosService.criaFluxoCaixa(fluxoCaixaInstance)


		if (fluxoCaixaInstance.save(flush: true)) {
			flash.message = "${message(code: 'default.created.message', args: [message(code: 'fluxoCaixa.label', default: 'FluxoCaixa'), fluxoCaixaInstance.id])}"
			redirect(action: "show", id: fluxoCaixaInstance.id)
		}
		else {
			render(view: "create", model: [fluxoCaixaInstance: fluxoCaixaInstance])
		}
	}

	public double apuraSaldoFc(String contas, Date dataInicial){

		//montando SQLs para apuração do saldo
		//String contas = contas
		//Date dataInicial = dataInicial

		println("DATASOURCE " + dataSource)
		def sql = new Sql(dataSource)


		def queryApuraCreditos = "select sum(valor+acrescimo) as creditos from contas_receber"
		queryApuraCreditos += " where baixada = true and data_baixa< :dataInicial and conta_corrente_id in (:contaCorrenteId)"

		def paramsApuraCreditos = [contaCorrenteId: contas, dataInicial:dataInicial ]

		def creditos = sql.rows(queryApuraCreditos, paramsApuraCreditos)

		double credito

		if (creditos.creditos[0] == null){
			credito = 0
		} else {
			credito = Double.parseDouble(creditos.creditos[0].toString())
		}

		def queryApuraDebitos = "select sum(valor+acrescimo) as debitos from contas_pagar"
		queryApuraDebitos += " where baixada = true and data_baixa< :dataInicial and conta_corrente_id in (:contaCorrenteId)"

		def debitos = sql.rows(queryApuraDebitos, paramsApuraCreditos)
		double debito

		if (debitos.debitos[0] == null){
			debito = 0
		}else{
			debito = Double.parseDouble(debitos.debitos[0].toString())
		}

		return credito - debito
	}


}
